package org.jsola.hr.service;

import org.jsola.core.Page;
import org.jsola.core.service.IService;
import org.jsola.hr.dao.IEmpSocItemDAO;
import org.jsola.hr.dto.EmpSocItemAddDTO;
import org.jsola.hr.dto.EmpSocItemDTO;
import org.jsola.hr.dto.EmpSocItemUpdateDTO;
import org.jsola.hr.dto.syncSocDTO.QingDaoCardinalityDefaultDTO;
import org.jsola.hr.entity.EmpSocInfoDO;
import org.jsola.hr.entity.EmpSocItemDO;
import org.jsola.hr.query.EmpSocItemQuery;
import org.jsola.hr.vo.EmpSocItemListVO;
import org.jsola.hr.vo.EmpSocItemVO;
import org.jsola.user.core.TokenUser;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;


/**
 * 员工参保信息表子项
 *
 * @author zhr
 */
public interface IEmpSocItemService extends IService<IEmpSocItemDAO, EmpSocItemDO> {

    /**
     * 新增员工参保信息表子项
     *
     * @param empSocItemAddDTO 新增员工参保信息表子项DTO
     * @param tokenUser        当前用户
     * @return 员工参保信息表子项详情信息
     */
    EmpSocItemVO save(EmpSocItemAddDTO empSocItemAddDTO, TokenUser tokenUser);

    /**
     * 新增员工参保信息表子项  保存do全部数据 仅用于更换公司使用
     *
     * @param empSocItemDO 新增员工参保信息表子项DO
     * @return 保存数量
     */
    Integer onlySave(EmpSocItemDO empSocItemDO);

    /**
     * 批量新增员工参保信息表子项
     *
     * @param empSocItemAddDTOList 新增员工参保信息表子项DTO
     * @param tokenUser            当前用户
     * @return 员工参保信息表子项详情信息
     */
    List<EmpSocItemVO> batchSave(List<EmpSocItemAddDTO> empSocItemAddDTOList, TokenUser tokenUser);

    /**
     * 修改员工参保信息表子项
     *
     * @param empSocItemUpdateDTO 修改员工参保信息表子项DTO
     * @param tokenUser           当前用户
     * @return 更新数量
     */
    int update(EmpSocItemUpdateDTO empSocItemUpdateDTO, TokenUser tokenUser);


    /**
     * 批量删除员工参保信息表子项，物理删除，更新is_valid字段，从回收站删除
     *
     * @param tokenUser     当前用户
     * @param empSocItemIds 员工参保信息表子项id
     * @return 删除数量
     */
    int deleteByIds(TokenUser tokenUser, String... empSocItemIds);

    /**
     * 根据员工参保信息表子项id查找
     *
     * @param empSocItemId 员工参保信息表子项id
     * @param siteId       所属站点id
     * @return 员工参保信息表子项详情信息
     */
    EmpSocItemVO selectById(String empSocItemId, String siteId);

    /**
     * 查询员工参保信息表子项
     *
     * @param empSocItemQuery 查询条件
     * @param siteId          所属站点id
     * @return 员工参保信息表子项列表信息
     */
    List<EmpSocItemListVO> select(EmpSocItemQuery empSocItemQuery, String siteId);

    /**
     * 查询员工参保信息表子项记录数
     *
     * @param empSocItemQuery 查询条件
     * @param siteId          所属站点id
     * @return 员工参保信息表子项记录数
     */
    int selectCount(EmpSocItemQuery empSocItemQuery, String siteId);

    /**
     * 分页查询员工参保信息表子项
     *
     * @param empSocItemQuery 查询条件
     * @param siteId          所属站点id
     * @return 员工参保信息表子项列表信息
     */
    Page<EmpSocItemListVO> selectPage(EmpSocItemQuery empSocItemQuery, String siteId);


    /**
     * 根据员工参保信息表子项id查找
     *
     * @param empSocItemId 员工参保信息表子项id
     * @param siteId       所属站点id
     * @return 员工参保信息表子项
     */
    EmpSocItemDO selectDOById(String empSocItemId, String siteId);

    /**
     * 查询员工参保信息表子项
     *
     * @param empSocItemQuery 查询条件
     * @param siteId          所属站点id
     * @return 员工参保信息表子项列表
     */
    List<EmpSocItemDO> selectDO(EmpSocItemQuery empSocItemQuery, String siteId);

    /**
     * 根据员工参保信息id查询员工参保信息表子项
     *
     * @param empSocId 员工参保信息ID
     * @param siteId   所属站点id
     * @return 员工参保信息表子项列表
     */
    List<EmpSocItemDO> selectByEmpSocId(String empSocId, String siteId);

    /**
     * 根据员工参保信息id查询员工参保信息表子项
     *
     * @param empSocIdList 员工参保信息ID集合
     * @param siteId       所属站点id
     * @return 员工参保信息表子项列表
     */
    List<EmpSocItemDO> selectByEmpSocIdList(List<String> empSocIdList, String siteId);

    /**
     * 根据 参保方案Id 和 子项名称 查询一条子项
     *
     * @param siteId   站点
     * @param itemName 子项名称
     * @param empSocId 参保方案Id
     * @return 子项信息
     */
    EmpSocItemDO selectEmpSocItemByInfoIdAndName(String siteId, String itemName, String empSocId);

    /**
     * 根据 参保方案Id 查询参保方案子项
     *
     * @param empSocId 参保方案Id
     * @param siteId   站点
     * @return 子项信息
     */
    List<EmpSocItemDO> selectEmpSocItemByInfoId(String empSocId, String siteId);

    /**
     * 保存员工参保方案子项(增员用)
     *
     * @param empSocItemDTOList 子项DTO
     * @param empSocInfoDO      参保信息
     * @param tokenUser         当前用户
     */
    void saveItemWithIncrement(List<EmpSocItemDTO> empSocItemDTOList, EmpSocInfoDO empSocInfoDO, TokenUser tokenUser);

    /**
     * 根据参保管理Id列表删除
     *
     * @param empSocInfoIdList 参保管理Id列表
     */
    void batchDeleteByEmpSocInfoIdList(List<String> empSocInfoIdList);

    /**
     * 查询某个参保管理的公积金子项
     *
     * @param empSocInfoId 参保管理Id
     * @param siteId       站点
     * @return 公积金子项
     */
    List<EmpSocItemDO> selectPfByEmpSocInfoId(String empSocInfoId, String siteId);

    /**
     * 查询某个参保管理的社保子项
     *
     * @param empSocInfoId 参保管理Id
     * @param siteId       站点
     * @return 社保子项
     */
    List<EmpSocItemDO> selectSocByEmpSocInfoId(String empSocInfoId, String siteId);

    /**
     * 填充部分empSocItemDO属性
     *
     * @param itemName                    子项名称
     * @param empSocInfoId                参保信息表id
     * @param cardinalityDefault          基数
     * @param amountCompany               公司金额
     * @param amountPersonal              个人金额
     * @param empSocItemList              填充后存放的容器
     * @param proportionCompany           公司比例
     * @param proportionPersonal          个人比例
     * @param tokenUser                   当前用户
     * @param cardinalityDefaultGroupType 基数
     * @param type                        子项类型
     * @return 个人金额, 公司金额
     */
    BigDecimal[] syncFillEmpSocInfoItem(String itemName, String empSocInfoId, String cardinalityDefault,
                                        String amountCompany, String amountPersonal, String proportionCompany,
                                        String proportionPersonal, List<EmpSocItemDO> empSocItemList,
                                        Map<String, QingDaoCardinalityDefaultDTO> cardinalityDefaultGroupType,
                                        Integer type, TokenUser tokenUser);

    /**
     * 删除参保管理中的公积金/或社保子项
     *
     * @param empSocInfoId 参保管理Id
     * @param itemType     子项类型
     * @param siteId       站点
     */
    void deleteByEmpSocInfoIdAndItemType(String empSocInfoId, Integer itemType, String siteId);

    /**
     * 根据员工参保信息id和子项类型查询员工参保信息表子项
     *
     * @param empSocId 员工参保信息ID
     * @param itemType 子项类型
     * @param siteId   所属站点id
     * @return 员工参保信息表子项列表
     */
    List<EmpSocItemDO> selectByEmpSocIdAndItemType(String empSocId, Integer itemType, String siteId);

    /**
     * 按照参保信息表Id逻辑删除数据
     *
     * @param empSocInfoList 参保信息表Id
     * @param tokenUser      当前用户
     * @return 修改结果
     */
    Integer updateEmpSocItemByEmpSocInfoIds(List<String> empSocInfoList, TokenUser tokenUser);

    /**
     * 根据员工参保信息id列表查找它们对应的子项
     *
     * @param empSocInfoIdList 工参保信息id列表
     * @param tokenUser        当前用户
     * @return 子项列表
     */
    List<EmpSocItemVO> selectByEmpSocIdList(List<String> empSocInfoIdList, TokenUser tokenUser);

    /**
     * 根据子项列表删除
     *
     * @param deleteList 子项列表
     */
    void deleteByDoList(List<EmpSocItemDO> deleteList);

    /**
     * 删除参保信息下面的所有子项
     *
     * @param empSocInfoId 参保信息Id
     */
    void deleteBySocInfoId(String empSocInfoId);

    /**
     * 批量编辑修改子项基数
     *
     * @param dataMap        要修改的数值
     * @param empSocItemList 子项列表
     * @param onlySocAmount  是否仅设置参保金额
     * @param tokenUser      当前用户
     */
    void updateItemCardinality(Map<String, String> dataMap, List<EmpSocItemDO> empSocItemList,
                               Boolean onlySocAmount, TokenUser tokenUser);

    /**
     * 根据社保子项名称获取这个子项对应的社保类型
     *
     * @param itemName 子项名称
     * @return 子项类型
     */
    Integer getTypeByItemName(String itemName);

    /**
     * 查询租户下的所有子项
     *
     * @param tokenUser 子项名称
     * @return 子项类型
     */
    List<EmpSocItemDO> selectBySite(TokenUser tokenUser);

}


